\documentclass[C:/Users/12748/Desktop/latex模板/main/main.tex]{subfiles}
\begin{document}

\begin{itemize}
\item
  选择一个第 \(i\) 数之后就不能选择 \(i+1,i-1\)，求可以获得的最大值？
\item
  增加类似\textbf{退流思想（雾）}的反悔机制
\item
  将所有数都放入优先队列，当选择 \(i\) 之后给它加个反悔机制，即把
  \(a[i+1]+a[i-1] - a[i]\) 作为一个新的数插到优先队列里，其含义为选择
  \(i+1,i-1\) 而不选 \(i\)。
\end{itemize}

\begin{lstlisting}
const int N = 1e5 + 10;
int n , k , l[N] , r[N] , b[N] , vis[N];
struct node{
	int id , val;
	bool operator < (const node & b) const {
		return val > b.val;
	}
}a[N];
priority_queue<node>que;
signed main()
{
	int cnt = 0;
	cin >> n >> k;
	for(int i = 1 ; i <= n ; i ++) cin >> b[i];
	for(int i = 2 ; i <= n ; i ++)
	{
		a[++ cnt].id = i - 1;
		a[cnt].val = b[i] - b[i - 1];
		l[i - 1] = i - 2;
		r[i - 1] = i;
		que.push(a[cnt]);
	}
	a[0].val = a[cnt + 1].val = 0x3f3f3f3f;
	long long res = 0;
	while(!que.empty() && k)
	{
		node u = que.top();
		que.pop();
		if(vis[u.id]) continue ;
		k -- ;
		int id = u.id , val = a[id].val , L = l[id] , R = r[id];
		res += val;
		vis[L] = vis[R] = 1;
		a[id].val = a[L].val + a[R].val - a[id].val;
		l[id] = l[L] , r[id] = r[R];
		r[l[L]] = l[r[R]] = id; 
		que.push(a[id]);
	}
	cout << res << '\n';
	return 0;
}
\end{lstlisting}

\end{document}
